package pe.gob.mtpe.renoccsys.managedBeans;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import org.primefaces.context.RequestContext;

import pe.gob.mtpe.renoccsys.bean.Persona;
import pe.gob.mtpe.renoccsys.mybatis.despachadores.PersonaDespatch;
import pe.gob.mtpe.renoccsys.reniecws.ReniecWebService;
import pe.gob.mtpe.renoccsys.utils.FacesUtils;


@ManagedBean(name="personaBean")
@SessionScoped
public class PersonaBean {
	
	private Persona  personaMan;
	private List<Persona> lstPersonas;
	private String   tipMensaje;
	private String   tipoOperacion;
	private Persona  personaParam;	
	//usuario de la sesion
		//@ManagedProperty("#{renoccBean.}")
		//private Usuario  PGP_Usuario;
	
	public PersonaBean(){
		inicializar();
	}
	private void inicializar(){
		personaMan=new Persona();
		lstPersonas=new ArrayList<Persona>();
		personaParam=new Persona();
	}
	
	public void limpiarFormulario(){
		lstPersonas=new ArrayList<Persona>();
		personaParam=new Persona();
	}
	
	/*public String buscarPersonaMant() throws Exception{
		String vista="";
		PersonaDespatch dspPersona=new PersonaDespatch();
		personaParam.valuesToString();
		String texto="";
		Integer tipo=0;	
		
		if (personaParam.getV_numdoc().length()<8) {
			FacesUtils.showFacesMessage("No es un número de documento válido", 1);
		} else {
			lstPersonas=dspPersona.listarPersona(personaParam);
			if(lstPersonas==null){
				texto="Ha ocurrido un error interno, ingrese otra vez a la opción ";
				tipo=1;
			}else{
				if(lstPersonas.size()==0){
					
					//REALIZA UNA NUEVA BUSQUEDA PERO AHORA EN WS RENIEC
					ReniecWebService rws = new ReniecWebService();
					Persona pex = rws.obtenerPersonaSWReniec(personaParam);
					if (pex!=null) {
						System.out.println("ENCONTRO EN WEB SERVICE");
						lstPersonas=new ArrayList<Persona>();
						lstPersonas.add(0, pex);
					} else {
						texto="No se encontró información con los datos ingresados";
						tipo=3;
					}
				}
			}
		}
		
		if(texto!=""){
			FacesUtils.showFacesMessage(texto, tipo);
		}
		
		return vista;		
	}*/
	
	public String buscarPersonaMant() throws Exception{
		String vista="";
		PersonaDespatch dspPersona=new PersonaDespatch();
		personaParam.valuesToString();
		String texto="";
		Integer tipo=0;	
		
		//if (personaParam.getV_numdoc().length()<8) {
			//FacesUtils.showFacesMessage("No es un número de documento válido", 1);
		//} else {
		
		//EVALUA POR TIPO DE DOCUMENTO
		if (personaParam.getV_codtdocide().equals("03")) {
			//SI ES DNI
			//BUSCA PRIMERO EN SITB_PERSONA
			lstPersonas=dspPersona.listarPersona(personaParam);
			if(lstPersonas==null){
				texto="Ha ocurrido un error interno, ingrese otra vez a la opción ";
				tipo=1;
			}else{
				if(lstPersonas.size()==0){
					//NO ENCONTRO EN SITB_PERSONA, ASI QUE AHORA BUSCARA EN WS RENIEC
					/*ReniecWebService rws = new ReniecWebService();
					Persona pex = rws.obtenerPersonaSWReniec(personaParam);
					if (pex!=null) {
						lstPersonas=new ArrayList<Persona>();
						lstPersonas.add(0, pex);
					} else {*/
						texto="No se encontró información con los datos ingresados";
						tipo=3;
					//}
				}
			}
			
		} else {
			//SI ES CUALQUIER OTRO TIPO DE DOCUMENTO
			lstPersonas=dspPersona.listarPersona(personaParam);
			if(lstPersonas==null){
				texto="Ha ocurrido un error interno, ingrese otra vez a la opción ";
				tipo=1;
			}else{
				if(lstPersonas.size()==0){
					texto="No se encontró información con los datos ingresados";
					tipo=3;
				}
			}
			
		}
		
		
		//}
		
		if(texto!=""){
			FacesUtils.showFacesMessage(texto, tipo);
		}
		
		return vista;		
	}
	
	public String actualizarPersona()throws Exception{
		String vista="";
		PersonaDespatch dspPersona=new PersonaDespatch();
		String mensajeError="";
		String texto="";
		Integer tipo=0;		
			
		Calendar c1 = GregorianCalendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        c1.add(Calendar.YEAR, -18);
        
        String maxFecNac = sdf.format(c1.getTime());
        String fecnac = "";
        String hoy = sdf.format(new Date());
        
        boolean resp = true;
        boolean resp2 = true;
        
        	fecnac = sdf.format(personaMan.getD_fecnac());
        	resp = compararFechas(fecnac, hoy);
	        resp2 = compararFechas(fecnac, maxFecNac);
	        
	        if (resp2 == false || resp == false) {
				tipo=1;
				if (resp2==false) {
					texto="El trabajador debe ser mayor de 15 años";
				}if (resp==false) {
					texto="La fecha de nacimiento no debe ser una fecha futura";
				}
				vista="pretty:mnt_persona";
			}else {
				mensajeError=dspPersona.actualizarPersona(personaMan);
				
				//validamos si hubo error
				if(mensajeError==""){
					texto="La persona ha sido actualizada con éxito";
					tipo=3;		
					lstPersonas=new ArrayList<Persona>();
					personaParam.setV_numdoc(personaMan.getV_numdoc());
					personaParam.setV_codtdocide(personaMan.getV_codtdocide());
					lstPersonas=dspPersona.listarPersona(personaParam);
					lstPersonas=dspPersona.listarPersona(personaParam);
					vista="pretty:lst_persona";
					personaMan=new Persona();
				}else{
					texto="Ocurrió un error en la actualización, por favor intente otra vez";
					tipo=1;				
					vista="pretty:mnt_persona";
				}		
				
			}
		
			
		
		if(texto!=""){
			FacesUtils.showFacesMessage(texto, tipo);
		}
		
		return vista;
		
	}
	
	
	/* MOSTRAR DIALOGO DE CONFIRMACION PARA INSERTAR UNA PERSONA*/
	public void mostrarDlgInsPersona() {
		System.out.println("Valida la busqueda");
		boolean flagDlgInsPersona=false;
		
		personaMan.valuesToString();
		
		if (personaMan.getV_codtdocide()==null || 
				personaMan.getV_numdoc()==null || 
				personaMan.getV_apepater()==null ||
				personaMan.getV_apemater()==null ||
				personaMan.getV_nombres()==null ||
				personaMan.getC_codsexo()==null){
			flagDlgInsPersona=false;
		} else {
			flagDlgInsPersona=true;
		}
		
		RequestContext context=RequestContext.getCurrentInstance();
		context.addCallbackParam("flagDlgInsPersona", flagDlgInsPersona);
	}
	
	
	
	public String registrarPersona()throws Exception{
		String vista="";
		PersonaDespatch dspPersona=new PersonaDespatch();
		String mensajeError="";
		String texto="";
		Integer tipo=0;
		Persona personaValidacion=dspPersona.getTrabajador(personaMan);
		
		
		
		if(personaValidacion==null){
			
			personaMan.valuesToString();
			Calendar c1 = GregorianCalendar.getInstance();
	        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
	        c1.add(Calendar.YEAR, -15);
	        
	        String maxFecNac = sdf.format(c1.getTime());
	        String fecnac = "";
	        String hoy = sdf.format(new Date());
	        
	        boolean resp = true;
	        boolean resp2 = true;
	        
	        	fecnac = sdf.format(personaMan.getD_fecnac());
	        	resp = compararFechas(fecnac, hoy);
		        resp2 = compararFechas(fecnac, maxFecNac);
		        
		        if (resp2 == false || resp == false) {
					tipo=1;
					if (resp2==false) {
						texto="El postulante debe ser mayor de 15 años";
					}if (resp==false) {
						texto="La fecha de nacimiento no debe ser una fecha futura";
					}
					vista="pretty:mnt_persona";
				}else {
					mensajeError=dspPersona.insertarPersona(personaMan);
					//validamos si hubo error
					if(mensajeError==""){
						texto="La persona ha sido registrada con éxito";
						tipo=3;	
						personaParam.setV_numdoc(personaMan.getV_numdoc());
						personaParam.setV_codtdocide(personaMan.getV_codtdocide());
						lstPersonas=dspPersona.listarPersona(personaParam);
						vista="pretty:lst_persona";
						personaMan=new Persona();
					}else{
						texto="Ocurrió un error en el registro, por favor intente otra vez";
						tipo=1;				
						vista="pretty:mnt_persona";
					}
				}
			
		}else{
			texto="Ya está registrada una persona con ese número de documento "+
					personaValidacion.getV_apepater() +" "+personaValidacion.getV_apemater()+" "+personaValidacion.getV_nombres();
			tipo=1;
			vista="pretty:mnt_persona";
		}
		
		//ACTUALIZAMOS LOS COMPONENTES:
		Map<String,String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
		String paramupd = "" + params.get("flgUpdate");
		//FacesUtils.setSessionAttribute("flgUpdate", paramupd);
		System.out.println("parametro actualizar: " + paramupd);
				
		
		if(texto!=""){
			FacesUtils.showFacesMessage(texto, tipo);
		}
		return vista;
	}
	
	public String redmntPersona(){
		String vista="";
		tipoOperacion="insertar";
		personaMan=new Persona();
		vista="pretty:mnt_persona";
		return vista;
	}
	
	public String redmntPersonaModificar(){
		String  vista="";
		String  texto="";
		Integer tipo=0;
		if(personaMan.getV_numdoc()=="" || personaMan.getV_numdoc()==null){
			vista="pretty:lst_persona";
			texto="Debe seleccionar primero una persona";
			tipo=1;
		}else{
			tipoOperacion="modificar";
			vista="pretty:mnt_persona";
			
		}
		
		if(texto!=""){
			FacesUtils.showFacesMessage(texto, tipo);
		}
		return vista;
	}
	
	
	/***
	 * geter seter
	 * @return
	 */

	public Persona getPersonaMan() {
		return personaMan;
	}

	public void setPersonaMan(Persona personaMan) {
		this.personaMan = personaMan;
	}
	public List<Persona> getLstPersonas() {
		return lstPersonas;
	}
	public void setLstPersonas(List<Persona> lstPersonas) {
		this.lstPersonas = lstPersonas;
	}
	public String getTipMensaje() {
		return tipMensaje;
	}
	public void setTipMensaje(String tipMensaje) {
		this.tipMensaje = tipMensaje;
	}
	public String getTipoOperacion() {
		return tipoOperacion;
	}
	public void setTipoOperacion(String tipoOperacion) {
		this.tipoOperacion = tipoOperacion;
	}
	public Persona getPersonaParam() {
		return personaParam;
	}
	public void setPersonaParam(Persona personaParam) {
		this.personaParam = personaParam;
	}
	
	
	
	private boolean compararFechas(String fecha1, String fechaActual) {  					
		  
		  String resultado="";
		  boolean compara = false;
		  try {
		   /**Obtenemos las fechas enviadas en el formato a comparar*/
		   SimpleDateFormat formateador = new SimpleDateFormat("dd/MM/yyyy"); 
		   Date fechaDate1 = formateador.parse(fecha1);
		   Date fechaDate2 = formateador.parse(fechaActual);
		  
		    if ( fechaDate1.before(fechaDate2) ){
		    resultado= "La Fecha 1 es menor ";
		    compara = true;
		    }else{
		     if ( fechaDate2.before(fechaDate1) ){
		      resultado= "La Fecha 1 es Mayor ";
		      compara = false;
		     }else{
		      resultado= "Las Fechas Son iguales ";
		      compara = true;
		     } 
		    }
		  } catch (Exception e) {
			  	e.printStackTrace();
		  } 
		  System.out.println("resultado de comparacion: " + resultado);
		  return compara;
		 }
	
	public void btnDlgPersona() {
		try {
			System.out.println("ABRIR DLG REGISTRAR PERSONA");
			RequestContext context = RequestContext.getCurrentInstance();
			context.execute("dlg1.hide()");
			context.execute("dlgRegistrarPersona.show()");
			String paramupd = "" + FacesUtils.getSessionAttribute("flgUpdate");
			FacesUtils.setSessionAttribute("flgUpdate", paramupd);
			System.out.println("oooooooooooooo parametro actualizar: " + paramupd);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	
	
	

}
